﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;

namespace Anagramme.Views
{
    /// <summary>
    /// Activitée d'attente de commande
    /// </summary>
    public sealed class WaitForCommand : NativeActivity<string>
    {
        #region Fields
        private BookmarkCallback _waitForCommandCallback;
        #endregion

        #region Properties
        /// <summary>
        /// Obtient ou définit la commande attendue
        /// </summary>
        public InArgument<string> CommandName { get; set; }

        /// <summary>
        /// Obtient le callback de la commande
        /// </summary>
        private BookmarkCallback WaitForCommandCallback
        {
            get
            {
                return this._waitForCommandCallback ??
                       (this._waitForCommandCallback = new BookmarkCallback(this.OnWaitForCommandCallback));
            }
        }
        #endregion

        #region Methods
        /// <summary>
        /// Crée le callback de commande
        /// </summary>
        /// <param name="context">Context de l'activité</param>
        /// <param name="bookmark">Bookmark associé</param>
        /// <param name="value">Valeur du callback</param>
        private void OnWaitForCommandCallback(NativeActivityContext context, Bookmark bookmark, object value)
        {
            this.Result.Set(context, this.CommandName.Get(context));
        }
        #endregion

        #region NativeActivity Overrides
        /// <summary>
        /// Obtient une valeur qui indique si l'activité peut faire passer le flux de travail à l'état inactif.
        /// </summary>
        protected override bool CanInduceIdle
        {
            get
            {
                return true;
            }
        }

        /// <summary>
        /// Lors de l'implémentation dans une classe dérivée, exécute la logique d'exécution de l'activité.
        /// </summary>
        /// <param name="context">Contexte d'exécution sous lequel l'activité s'exécute.</param>
        protected override void Execute(NativeActivityContext context)
        {
            if (object.ReferenceEquals(context, null))
            {
                throw new ArgumentNullException("context");
            }
            context.CreateBookmark(this.CommandName.Get(context), this.WaitForCommandCallback);
        }
        #endregion
    }
}
